Changeset 8118


Ignore:
Timestamp:
May 20, 2019, 2:47:42 PM (3 years ago)
Author:
kopal
Message:

HomophonicAnalyzer:

  • analyzer now also outputs key and found words
  • small text fixes
Location:
trunk/CrypPlugins/HomophonicSubstitutionAnalyzer
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/HomophonicSubstitutionAnalyzer/HillClimber.cs

    r8116 r8118  
    325325        public string CiphertextAlphabet{ get;set;}
    326326        public double CostValue{ get;set;}
     327        public List<string> FoundWords { get; set; }
     328        public String SubstitutionKey { get; set; }
    327329    }
    328330
  • trunk/CrypPlugins/HomophonicSubstitutionAnalyzer/HomophoneSubstitutionAnalyzerPresentation.xaml.cs

    r8117 r8118  
    7070            DisableUIAndStop();           
    7171        }
    72  
     72
    7373        /// <summary>
    7474        /// Initializes the ui with a new ciphertext
    7575        /// </summary>
    7676        /// <param name="ciphertext"></param>
     77        /// <param name="ciphertextFormat"></param>
     78        /// <param name="separator"></param>
     79        /// <param name="costFactorMultiplicator"></param>
     80        /// <param name="fixedTemperature"></param>
    7781        public void AddCiphertext(string ciphertext, CiphertextFormat ciphertextFormat, char separator, int costFactorMultiplicator, int fixedTemperature)
    7882        {
     
    284288        /// Generates the tab for the selection of the key letter distribution
    285289        /// </summary>
    286         /// <param name="PlainAlphabetText"></param>
    287290        public void GenerateKeyLetterLimitsListView()
    288291        {
     
    426429            AutoResetEvent waitHandle = new AutoResetEvent(false);
    427430            bool newTopEntry = false;
     431            Dictionary<int, int> wordPositions = null;
    428432            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    429433            {
     
    446450                    PlainAlphabetTextBox.Text = eventArgs.PlaintextMapping;
    447451                    CostTextBox.Text = String.Format(Properties.Resources.CostValue_0, Math.Round(eventArgs.CostValue, 2));
    448                     var wordPositions = AutoLockWords(AnalyzerConfiguration.WordCountToFind);
    449452                    MarkLockedHomophones();
     453                    wordPositions = AutoLockWords(AnalyzerConfiguration.WordCountToFind);
    450454                    MarkFoundWords(wordPositions);
    451 
    452455                    newTopEntry = AddNewBestListEntry(eventArgs.PlaintextMapping, eventArgs.CostValue, eventArgs.Plaintext);
     456                    if (newTopEntry)
     457                    {
     458                        var substitutionKey = GenerateSubstitutionKey();
     459                        eventArgs.SubstitutionKey = substitutionKey;
     460                    }
    453461                }
    454462                catch (Exception)
     
    466474
    467475            if (NewBestValue != null)
    468             {               
     476            {
     477                if (newTopEntry && wordPositions != null && wordPositions.Count > 0)
     478                {
     479                    eventArgs.FoundWords = new List<string>();
     480                    //if we have a new top entry, we also output the found words
     481                    foreach (KeyValuePair<int,int> positionLength in wordPositions)
     482                    {
     483                        var word = eventArgs.Plaintext.Substring(positionLength.Key, positionLength.Value);
     484                        eventArgs.FoundWords.Add(word);
     485                    }
     486                }
     487
    469488                eventArgs.NewTopEntry = newTopEntry;
    470489                NewBestValue.Invoke(sender, eventArgs);
    471490            }
     491        }
     492
     493        /// <summary>
     494        /// Generates the current substitution key which can be used by
     495        /// the Substitution component with the nomenclature templates
     496        /// </summary>
     497        /// <returns></returns>
     498        private string GenerateSubstitutionKey()
     499        {
     500            var keyDictionary = new Dictionary<string, List<string>>();
     501            foreach (var ciphertextLabel in _ciphertextLabels)
     502            {
     503                if(ciphertextLabel == null)
     504                {
     505                    continue;
     506                }
     507                var x = ciphertextLabel.X;
     508                var y = ciphertextLabel.Y;
     509                var plaintextLabel = _plaintextLabels[x, y];
     510
     511                if (plaintextLabel != null)
     512                {
     513                    var plainletter = plaintextLabel.Symbol;
     514                    var cipherletter = _originalCiphertextSymbols[ciphertextLabel.SymbolOffset];
     515
     516                    if (!keyDictionary.ContainsKey(plainletter))
     517                    {
     518                        keyDictionary.Add(plainletter, new List<string>());
     519                    }
     520                    if (!keyDictionary[plainletter].Contains(cipherletter))
     521                    {
     522                        keyDictionary[plainletter].Add(cipherletter);
     523                    }
     524                }
     525            }
     526            var builder = new StringBuilder();
     527            foreach (var keyValuePair in keyDictionary)
     528            {
     529                builder.Append(String.Format("[{0}];", keyValuePair.Key));
     530                var list = keyValuePair.Value;
     531                for (var i = 0; i < list.Count; i++)
     532                {
     533                    var symbol = list[i];
     534                    if (i == 0)
     535                    {
     536                        builder.Append("[");
     537                        builder.Append(symbol);
     538                    }
     539                    else if (i < list.Count - 1)
     540                    {
     541                        builder.Append("|");
     542                        builder.Append(symbol);
     543                    }
     544                    else
     545                    {
     546                        builder.Append("|");
     547                        builder.Append(symbol);
     548                        builder.AppendLine("]");
     549                    }
     550                }
     551                if(list.Count == 1)
     552                {
     553                    //if we have only one element, we have to close the tag
     554                    builder.AppendLine("]");
     555                }
     556            }
     557            return builder.ToString();
    472558        }
    473559
     
    664750                {
    665751                    UserChangedTextEventArgs args = new UserChangedTextEventArgs() { Plaintext = plaintext };
     752                    args.SubstitutionKey = GenerateSubstitutionKey();
    666753                    UserChangedText.Invoke(this, args);
    667754                }
     
    10721159        /// </summary>
    10731160        /// <param name="sender"></param>
    1074         /// <param name="e"></param>
     1161        /// <param name="routedEventArgs"></param>
    10751162        private void ContextMenuHandler(object sender, RoutedEventArgs routedEventArgs)
    10761163        {
     
    11521239    public class ResultEntry
    11531240    {
    1154         private int _ranking = 0;
    1155 
    11561241        public int Ranking { get; set; }
    11571242        public double Value { get; set; }
    11581243        public string Key { get; set; }
    11591244        public string Text { get; set; }
    1160         public event PropertyChangedEventHandler PropertyChanged;
    11611245    }   
    11621246}
  • trunk/CrypPlugins/HomophonicSubstitutionAnalyzer/HomophonicSubstitutionAnalyzer.cs

    r8116 r8118  
    1515*/
    1616using System.ComponentModel;
     17using System.Text;
    1718using System.Windows.Controls;
    1819using Cryptool.PluginBase;
     
    4748        #region Data Properties
    4849
    49         /// </summary>
    5050        [PropertyInfo(Direction.InputData, "CiphertextCaption", "CiphertextTooltip", true)]
    5151        public string Ciphertext
     
    5555        }
    5656
    57         /// </summary>
    5857        [PropertyInfo(Direction.InputData, "DictionaryCaption", "DictionaryTooltip", false)]
    5958        public string[] Dictionary
     
    7069        }
    7170
     71        [PropertyInfo(Direction.OutputData, "KeyCaption", "KeyTooltip")]
     72        public string Key
     73        {
     74            get;
     75            set;
     76        }
     77
     78        [PropertyInfo(Direction.OutputData, "FoundWordsCaption", "FoundWordsTooltip")]
     79        public string FoundWords
     80        {
     81            get;
     82            set;
     83        }
    7284        #endregion
    7385
     
    201213        /// </summary>
    202214        /// <param name="sender"></param>
    203         /// <param name="e"></param>
     215        /// <param name="progressChangedEventArgs"></param>
    204216        private void PresentationOnProgress(object sender, ProgressChangedEventArgs progressChangedEventArgs)
    205217        {
     
    226238                Plaintext = newBestValueEventArgs.Plaintext;
    227239                OnPropertyChanged("Plaintext");
     240                if (newBestValueEventArgs.FoundWords != null && newBestValueEventArgs.FoundWords.Count > 0)
     241                {
     242                    StringBuilder wordBuilder = new StringBuilder();
     243                    foreach (var word in newBestValueEventArgs.FoundWords)
     244                    {
     245                        wordBuilder.AppendLine(word);
     246                    }
     247
     248                    FoundWords = wordBuilder.ToString();
     249                    OnPropertyChanged("FoundWords");
     250                }
     251                if (!string.IsNullOrWhiteSpace(newBestValueEventArgs.SubstitutionKey))
     252                {
     253                    Key = newBestValueEventArgs.SubstitutionKey;
     254                    OnPropertyChanged("Key");
     255                }
    228256            }
    229257        }
     
    238266            Plaintext = userChangedTextEventArgs.Plaintext;
    239267            OnPropertyChanged("Plaintext");
     268            Key = userChangedTextEventArgs.SubstitutionKey;
     269            OnPropertyChanged("Key");
    240270        }
    241271
  • trunk/CrypPlugins/HomophonicSubstitutionAnalyzer/Properties/Resources.Designer.cs

    r8116 r8118  
    422422       
    423423        /// <summary>
    424         ///   Sucht eine lokalisierte Zeichenfolge, die Revealed Plaintext: ähnelt.
     424        ///   Sucht eine lokalisierte Zeichenfolge, die Revealed plaintext: ähnelt.
    425425        /// </summary>
    426426        internal static string Plaintext {
  • trunk/CrypPlugins/HomophonicSubstitutionAnalyzer/Properties/Resources.resx

    r8116 r8118  
    230230  </data>
    231231  <data name="Plaintext" xml:space="preserve">
    232     <value>Revealed Plaintext:</value>
     232    <value>Revealed plaintext:</value>
    233233  </data>
    234234  <data name="PlaintextMapping" xml:space="preserve">
Note: See TracChangeset for help on using the changeset viewer.