Changeset 700


Ignore:
Timestamp:
Oct 9, 2009, 4:48:46 PM (12 years ago)
Author:
Arno Wacker
Message:

Frequency Test:

  • Code cleanup for presentation (removed "parameter passing by static")
  • Added autozoom feature for chart-display (works well for few elements, i.e. unigrams, becomes ugly with bigrams, still some work needed)
  • When resizing to smaller size, it scales, when scaling afterward to bigger size it does not work, since the SizeChanged-Event is not fired - probably bug in editor.
  • Added a small sample for the Frequency analysis.

Enigma:

  • Corrected initial settings in the sample - now simply encrypting yields also directly the cleartext
Location:
trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/FrequencyTest/CollectionElement.cs

    r72 r700  
    88    public class CollectionElement
    99    {
    10 
    11 
    1210        private string m_caption;
    1311        private double m_percent;
    1412        private int m_amount;
    15 
    16 
    1713
    1814        public CollectionElement(int amount, double percent, string caption)
     
    2218            m_percent = percent;
    2319        }
    24 
    25 
    26 
    27 
    2820
    2921
     
    4638            }
    4739        }
     40
     41
    4842        public int Amount
    4943        {
     
    5448            }
    5549        }
    56 
    5750    }
    5851}
  • trunk/CrypPlugins/FrequencyTest/DataSource.cs

    r127 r700  
    99    public class DataSource
    1010    {
    11 
    1211        private ObservableCollection<CollectionElement> valueCollection;
    1312
     
    1817        }
    1918
    20         //public void AddtoCollection(int i, double d, string s)
    21         // {
    22         //    CollectionElement z = new CollectionElement(i, d, s);
    23         //    valueCollection.Add(z);
    24         // }
    25 
    2619        public DataSource()
    2720        {
    28             // CollectionElement z= new CollectionElement(30,30.5,"qqq");
    2921            valueCollection = new ObservableCollection<CollectionElement>();
    30             // valueCollection.Add(z);
    31             // CollectionElement y = new CollectionElement(30, 30.5, "qqq");
    32            // CollectionElement s = new CollectionElement(30, 30.5, "qqq");
    33             // valueCollection.Add(s);
    34             // valueCollection.Add(y);
    35             // CollectionElement q = new CollectionElement(30, 30.5, "qqq");
    36            //  valueCollection.Add(q);
    3722        }
    3823    }
  • trunk/CrypPlugins/FrequencyTest/FrequencyTest.cs

    r566 r700  
    3131        private int[] arrayOutput = new int[0];
    3232        private IDictionary<string, double[]> grams = new SortedDictionary<string, double[]>();
     33        private DataSource data = new DataSource();
     34        private double presentationScaler = 1.0;
     35        private double presentationOffset = 55.0;
    3336
    3437        // TODO: this shall be an algorithm setting or an optional word
    3538        private const string validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    3639
    37         internal static DataSource data = new DataSource();
     40       
    3841
    3942        #endregion
     
    116119        {
    117120            settings = new FrequencyTestSettings();
    118             presentation = new FrequencyTestPresentation(this);
     121            presentation = new FrequencyTestPresentation();
    119122            Presentation = presentation;
    120123            QuickWatchPresentation = presentation;
    121         }
     124
     125            presentation.SizeChanged += new System.Windows.SizeChangedEventHandler(presentation_SizeChanged);
     126        }
     127
    122128        public UserControl Presentation { get; private set; }
    123129
     
    141147            lock (grams)
    142148            {
    143                 data.ValueCollection.Clear();
    144149                grams.Clear();
    145150
     
    167172                }
    168173
    169                 double max = grams.Values.Max(item => item[PERCENTAGED]);
    170                 GuiLogMessage("Max n-gram percentage is: " + max, NotificationLevel.Debug);
    171 
    172                 // calculate presentation bars height
    173                 foreach (KeyValuePair<string, double[]> item in grams)
    174                 {
    175                     int height = (int)(item.Value[PERCENTAGED] * (160 / max));
    176                     CollectionElement row = new CollectionElement(height, Math.Round(item.Value[PERCENTAGED] * 100, 3), item.Key);
    177                     data.ValueCollection.Add(row);
    178                 }
    179 
    180174                // OUTPUT
    181175                StringBuilder sb = new StringBuilder();
     
    192186                }
    193187                stringOutput = sb.ToString();
     188
     189                // update the presentation data
     190                updatePresentation();
    194191            }
    195192
     
    197194            OnPropertyChanged("ArrayOutput");
    198195            OnPropertyChanged("DictionaryOutput");
    199             //if (OnPluginProgressChanged != null)
     196           
     197           
     198        }
     199
     200        private void ProcessWord(string workstring)
     201        {
     202            if (settings.ProcessUnknownSymbols == 0)
     203            {
     204                workstring = StringUtil.StripUnknownSymbols(validChars, workstring);
     205            }
     206
     207            if (workstring.Length == 0)
     208            {
     209                return;
     210            }
     211
     212            if (settings.CaseSensitivity == 0)
     213            {
     214                workstring = workstring.ToUpper();
     215            }
     216
     217            foreach (string g in GramTokenizer.tokenize(workstring, settings.GrammLength, settings.BoundaryFragments == 1))
     218            {
     219                if (!grams.ContainsKey(g))
     220                {
     221                    grams[g] = new double[] { 1, 0, 0, 0 };
     222                }
     223                else
     224                {
     225                    grams[g][ABSOLUTE]++;
     226                }
     227            }
     228        }
     229
     230
     231        private void updatePresentation()
     232        {
     233            if (grams.Count > 0)
     234            {
     235                double max = grams.Values.Max(item => item[PERCENTAGED]);
     236                GuiLogMessage("Max n-gram percentage is: " + max, NotificationLevel.Debug);
     237
     238                data.ValueCollection.Clear();
     239
     240                // calculate presentation bars height
     241                foreach (KeyValuePair<string, double[]> item in grams)
     242                {
     243
     244                    int height = (int)(item.Value[PERCENTAGED] * ((presentation.ActualHeight - presentation.sli.ActualHeight - (presentationOffset * presentationScaler)) / (max * presentationScaler)));
     245                    CollectionElement row = new CollectionElement(height, Math.Round(item.Value[PERCENTAGED] * 100, 2), item.Key);
     246                    data.ValueCollection.Add(row);
     247                }
     248
     249                presentation.ShowData(data);
     250            }
     251        }
     252
     253        private void presentation_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
     254        {
     255            // Just for debugging - maybe still need to hunt the width-bug (SizeChanged is not fired when presentation becomes wider)
     256            //if (e.HeightChanged)
    200257            //{
    201             //    OnPluginProgressChanged(this, new PluginProgressEventArgs(1, 1));
     258            //    GuiLogMessage("Height changed from "+e.PreviousSize.Height +" to " + e.NewSize.Height, NotificationLevel.Info);               
    202259            //}
    203             presentation.OpenPresentationFile();
    204         }
    205 
    206         private void ProcessWord(string workstring)
    207         {
    208             if (settings.ProcessUnknownSymbols == 0)
    209             {
    210                 workstring = StringUtil.StripUnknownSymbols(validChars, workstring);
    211             }
    212 
    213             if (workstring.Length == 0)
    214             {
    215                 return;
    216             }
    217 
    218             if (settings.CaseSensitivity == 0)
    219             {
    220                 workstring = workstring.ToUpper();
    221             }
    222 
    223             foreach (string g in GramTokenizer.tokenize(workstring, settings.GrammLength, settings.BoundaryFragments == 1))
    224             {
    225                 if (!grams.ContainsKey(g))
    226                 {
    227                     grams[g] = new double[] { 1, 0, 0, 0 };
    228                 }
    229                 else
    230                 {
    231                     grams[g][ABSOLUTE]++;
    232                 }
    233             }
    234         }
     260
     261            //if (e.WidthChanged)
     262            //{
     263            //    GuiLogMessage("Width changed from " + e.PreviousSize.Width + " to " + e.NewSize.Width, NotificationLevel.Info);
     264            //}
     265            //GuiLogMessage("Chart size: H=" + presentation.chart.ActualHeight + ", W=" + presentation.chart.ActualWidth, NotificationLevel.Info);
     266
     267            if (settings.Autozoom)
     268            {
     269                presentationScaler = e.NewSize.Width / presentation.chart.ActualWidth;
     270                presentation.sli.Value = presentationScaler;
     271            }
     272
     273            updatePresentation();
     274        }
     275
    235276
    236277        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
  • trunk/CrypPlugins/FrequencyTest/FrequencyTestPresentation.xaml

    r103 r700  
    1717        <DataTemplate x:Key="template" >
    1818
    19 
    2019            <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" >
    21 
    22                 <Rectangle Width="5"/>
     20                <Rectangle Width="3"/>
    2321                <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
    24 
     22                   
    2523                    <TextBlock HorizontalAlignment="Center" Text="{Binding Path=Percent}">
    2624                    </TextBlock>
     
    2826                    <Rectangle Height="3"/>
    2927
    30                     <Rectangle Height="{Binding Path=Amount}" Width="30" StrokeThickness="1" Stroke="Beige" RadiusX="5" RadiusY="5" ToolTip="{Binding Path=Caption}" >
     28                    <Rectangle Height="{Binding Path=Amount}" Width="20" StrokeThickness="1" Stroke="Beige" RadiusX="5" RadiusY="5" ToolTip="{Binding Path=Caption}" >
    3129                        <Rectangle.BitmapEffect>
    3230                            <DropShadowBitmapEffect />
     
    3937                            </RadialGradientBrush>
    4038                        </Rectangle.Fill>
    41                       <!--
    42                          <Rectangle.LayoutTransform>
    43                            
    44                         </Rectangle.LayoutTransform>
    45 -->
     39
    4640                    </Rectangle>
    4741
    48                     <Rectangle Height="10" />
     42                    <Rectangle Height="5" />
    4943
    5044                    <TextBlock HorizontalAlignment="Center" Text="{Binding Path=Caption}"/>
    5145       
    52                 </StackPanel>
    53                
     46                </StackPanel>               
    5447            </StackPanel>
    5548           
     
    6053        <ItemsPanelTemplate x:Key="panelTemplate">
    6154            <StackPanel Orientation="Horizontal"/>
    62 
    6355        </ItemsPanelTemplate>
    6456
    6557    </UserControl.Resources>
    6658   
    67       <StackPanel VerticalAlignment="Bottom" Orientation="Vertical" >
    68        <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"  ScrollViewer.HorizontalScrollBarVisibility="Auto">
     59   
     60   
     61   
     62   
     63    <StackPanel VerticalAlignment="Bottom" Orientation="Vertical"  Width="Auto">
     64            <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"  ScrollViewer.HorizontalScrollBarVisibility="Auto" x:Name="sw">
    6965       
    70            <Grid VerticalAlignment="Bottom" >
    71            <Grid.LayoutTransform>
    72            
    73               <ScaleTransform   ScaleX="{Binding ElementName=sli,Path=Value}" ScaleY="{Binding
     66            <Grid VerticalAlignment="Bottom" >
     67            <Grid.LayoutTransform>
     68                <ScaleTransform   ScaleX="{Binding ElementName=sli,Path=Value}" ScaleY="{Binding
    7469                         ElementName=sli, Path=Value}"/>
    75            </Grid.LayoutTransform>
     70            </Grid.LayoutTransform>
    7671
    77        
    78 
    79             <StackPanel VerticalAlignment="Bottom">
    80 
     72            <StackPanel VerticalAlignment="Bottom" x:Name="chart">
    8173               
    8274               <TextBlock TextAlignment="Center" FontSize="20" Foreground="DarkBlue"  FontFamily="Academy" OpacityMask="Turquoise" Text="Character Frequencies (in %)" ></TextBlock>
    8375
    84                <ItemsControl HorizontalAlignment="Center" VerticalAlignment="Bottom"
    85              
     76               <ItemsControl HorizontalAlignment="Center" VerticalAlignment="Bottom"           
    8677                 ItemsSource="{Binding Source={StaticResource source},Path=ValueCollection}"
    8778                 ItemTemplate="{StaticResource template}" ItemsPanel="{StaticResource panelTemplate}">
    88 
    8979               </ItemsControl>
    9080             
    91 
    9281            </StackPanel>
    93    
    94        
     82           
    9583          </Grid>
    96 
    9784
    9885        </ScrollViewer>
  • trunk/CrypPlugins/FrequencyTest/FrequencyTestPresentation.xaml.cs

    r389 r700  
    2424    public partial class FrequencyTestPresentation : UserControl
    2525    {
    26        // public static DependencyProperty  DataSource = FrequencyTest.Data ;
     26
     27        public  FrequencyTestPresentation()
     28        {
     29           InitializeComponent();
     30        }
    2731
    2832
    29         //private FrequencyTest freqT;
    30         public  FrequencyTestPresentation(FrequencyTest FrequencyTest)
    31         {
    32            InitializeComponent();
    33            //this.freqT = FrequencyTest;
    34            
    35            //this.freqT.Settings.PropertyChanged+=Settings_PropertyChanged;
    36            //freqT.OnPluginProgressChanged
    37         }
    38        // void Settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    39     //{
    40      // try
    41      // {
    42       //  if (e.PropertyName == "StringOutput")
    43       //  {
    44          
    45        //   OpenPresentationFile();
    46        // }
    47      // }
    48      // catch {}
    49     //}
    50         public void OpenPresentationFile()
     33        public void ShowData(DataSource data)
    5134        {
    5235            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    5336            {
    54                // if (freqT.StringOutput != null)
    55                // {
    56                     DataSource source = (DataSource)this.Resources["source"];
    57                     source.ValueCollection.Clear();
    58                     for (int i = 0; i < FrequencyTest.data.ValueCollection.Count; i++)
    59                     {
    60                         source.ValueCollection.Add(FrequencyTest.data.ValueCollection[i]);
    61                     }
    62                 //}
    63                    
    64                
     37                DataSource source = (DataSource)this.Resources["source"];
     38                source.ValueCollection.Clear();
     39                for (int i = 0; i < data.ValueCollection.Count; i++)
     40                {
     41                    source.ValueCollection.Add(data.ValueCollection[i]);
     42                }               
    6543            }, null);
    6644        }
  • trunk/CrypPlugins/FrequencyTest/FrequencyTestSettings.cs

    r425 r700  
    2626        private int grammLength = 1;
    2727        private int boundaryFragments = 0;
     28        private bool autozoom = true;
    2829       
    2930        /// <summary>
     
    111112            }
    112113        }
    113        
     114
     115        [PropertySaveOrder(5)]
     116        [TaskPane("Autozoom", "Should the chart perfrom autozoom?", "Presentation", 20, true, DisplayLevel.Beginner, ControlType.CheckBox)]
     117        public bool Autozoom
     118        {
     119            get { return this.autozoom; }
     120            set
     121            {
     122                if (value != autozoom)
     123                {
     124                    HasChanges = true;
     125                    autozoom = value;
     126                }
     127
     128                OnPropertyChanged("Autozoom");
     129            }
     130        }
     131
     132
    114133        #region INotifyPropertyChanged Members
    115134
Note: See TracChangeset for help on using the changeset viewer.