Guest User

Untitled

a guest
Oct 6th, 2011
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 10.66 KB | None | 0 0
  1. package cryptolab1
  2.  
  3. import java.awt.BorderLayout
  4. import java.awt.Component
  5. import java.awt.Dimension
  6. import java.awt.FlowLayout
  7. import java.awt.event._
  8. import java.io._
  9. import java.text.DecimalFormat
  10. import java.util.Random
  11. import java.util.Scanner
  12. import javax.swing._
  13. import javax.swing.border._
  14. import javax.swing.table._
  15. import collection.JavaConversions._
  16.  
  17. case class E(i:Int){
  18.   override def toString = "E"+i
  19. }
  20.  
  21. abstract class SimplifiedModel extends AbstractTableModel{
  22.   def getSize: (Int, Int)
  23.   def getTitle: String
  24.  
  25.   def getCustomCellEditor:Map[java.lang.Class[_],TableCellEditor] = null
  26.   def getCustomTopControl:Component = null
  27.  
  28.   def getColumnCount = getSize._2+1
  29.   def getRowCount = getSize._1
  30. }
  31.  
  32. class CryptographicFunction {
  33.   var df = new DecimalFormat("#.##");
  34.   var f = Array[Array[Int]]()
  35.   var Pm,Pk = Array[Double]()
  36.   var m,k,e:Int = 0
  37.   var models: List[SimplifiedModel] = List()
  38.  
  39.   def softUpdate = models.foreach(_.fireTableDataChanged)
  40.   def update = models.foreach(_.fireTableStructureChanged)
  41.  
  42.   def save(file: File){
  43.     val prn = new PrintWriter(new FileOutputStream(file))
  44.     prn.println(m+" "+k+" "+e)
  45.     for (i <- 1 to k){
  46.       for (j <- 1 to m) prn.print(f(i-1)(j-1)+" ")
  47.       prn.println
  48.     }
  49.     prn.close
  50.   }  
  51.  
  52.   def randomizeArray(a: Array[Double]){
  53.     val rnd = new Random
  54.     for (i<-0 to a.size-1) a(i) = rnd.nextDouble
  55.     val sum = a.sum;
  56.     for (i<-0 to a.size-1) a(i) /= sum    
  57.   }
  58.  
  59.   def dumpFileScenario(prn:PrintWriter, f:File) = {
  60.     load(f)
  61.     prn.println("Task:;M="+m+";K="+k+";E="+e+";")
  62.    
  63.     randomizeArray(Pm)
  64.    
  65.     for (mode <- 0 to 1){
  66.       prn.println("Keys - "+(if (mode==1) "automatic" else "same")+";")
  67.       if (mode==1) randomizeArray(Pk);
  68.       models.foreach(x=>{
  69.           prn.println(x.getTitle+";")
  70.           val l = (1 to x.getColumnCount) map {m=>x.getColumnName(m-1)}
  71.           prn.println(l.tail.foldLeft(l.head)((a,b)=>a+";"+b)+";")
  72.           for (i <- 1 to x.getRowCount){
  73.             val z = (1 to x.getColumnCount) map {m=>x.getValueAt(i-1,m-1)}
  74.             prn.println(z.tail.foldLeft(z.head)((a,b)=>a+";"+b)+";")
  75.           }
  76.           prn.println(";")
  77.       })  
  78.     }
  79.     prn.println(";")
  80.   }
  81.  
  82.   def dumpTestScenario = {
  83.     val prn = new PrintWriter(new FileOutputStream("dump.csv"));
  84.     List("input.txt","input_rect.txt","input_mlesse.txt").foreach({x=>dumpFileScenario(prn, new File(x))})
  85.     prn.close
  86.   }
  87.  
  88.   def load(file: File){
  89.     val scn: Scanner = new Scanner(new FileInputStream(file))
  90.     m = scn.nextInt
  91.     k = scn.nextInt
  92.     e = scn.nextInt
  93.    
  94.     f = (for (i <- 1 to k) yield (for (j <- 1 to m) yield scn.nextInt).toArray).toArray
  95.     Pm = (for (i <- 1 to m) yield 1.0/m).toArray
  96.     Pk = (for (i <- 1 to k) yield 1.0/k).toArray
  97.    
  98.     scn.close
  99.     update
  100.   }
  101.  
  102.   def getE = e
  103.   def getK = k
  104.   def getM = m
  105.  
  106.   def phi(m:Int, k:Int, e:Int) = if (f(k-1)(m-1)==e) 1 else 0
  107.  
  108.   def colF(j: Int) = for (i<-0 to k) yield f(i)(j-1)
  109.   def Nmi(i:Int, s:Int) = colF(i-1).count(x=>x==s)
  110.   def Pmies(i:Int, s:Int) =  (for (j<-1 to k) yield  Pk(j-1)*phi(i,j,s)).sum
  111.   def Pes(s:Int) = (for (i<-1 to m) yield (for(j<-1 to k) yield Pk(j-1)*Pm(i-1)*phi(i,j,s)).sum).sum
  112.   def PemMi(i:Int,s:Int) = Pm(i-1)*Pmies(i,s)/Pes(s)
  113.   def Peskj(s:Int,j:Int) = Pk(j-1)*Pkjes(j,s)/Pes(s)
  114.   def Pkjes(j:Int,s:Int) = (for (i<-1 to m) yield Pm(i-1)*phi(i,j,s)).sum
  115.   def decode(k:Int, e:Int) = f(k-1).findIndexOf(x=>x==e)+1
  116. }
  117.  
  118. class FTableModel(val crypto: CryptographicFunction) extends SimplifiedModel{
  119.   def getSize = (crypto.getK,crypto.getM)
  120.  
  121.   override def getColumnName(i: Int) = if (i==0) "" else "M"+i
  122.          
  123.   def getValueAt(i: Int, j: Int):Object = {
  124.     (i,j) match {
  125.       case(v,0) => "K"+(v+1)
  126.       case _ => E(crypto.f(i)(j-1))
  127.     }
  128.   }
  129.  
  130.   override def setValueAt(o:Object, i:Int, j:Int){
  131.     val e = o.asInstanceOf[E]
  132.     crypto.f(i)(j-1) = e.i
  133.     crypto.softUpdate
  134.   }
  135.  
  136.   override def isCellEditable(i: Int, j:Int) = j!=0
  137.          
  138.   override def getCustomCellEditor:Map[java.lang.Class[_],TableCellEditor]={
  139.     val items = (1 to crypto.getE).map(x=>E(x))
  140.     val comboBox = new JComboBox(asJavaList(items).toArray)
  141.     return Map(classOf[E] -> new DefaultCellEditor(comboBox))
  142.   }
  143.  
  144.   override def getColumnClass(i:Int)= if (i==0) classOf[String] else classOf[E]
  145.          
  146.   def getTitle = "f(m,k)"
  147. }
  148.  
  149. class ArraysModel(var crypto: CryptographicFunction,
  150.                   var title:String, var prefix:String,
  151.                   var array:()=>Array[Double],
  152.                   var showManual:Boolean)
  153. extends SimplifiedModel {
  154.   def getSize = (array().size+1,1)
  155.   var manualMode: JToggleButton = null;
  156.  
  157.   override def getColumnName(i: Int) = if (i==0) "" else title
  158.   override def getCustomTopControl: Component={
  159.     val panel = new JPanel
  160.     panel.setPreferredSize(new Dimension(500,70))
  161.     panel.setLayout(new FlowLayout(FlowLayout.LEADING, 5,2))
  162.     val automaticButton = new JButton("Автоматично");
  163.     automaticButton.addActionListener(new ActionListener(){
  164.         def actionPerformed(event:ActionEvent)={
  165.           val rnd = new Random
  166.           for (i <- 0 to array().size-1) array()(i) = rnd.nextDouble
  167.           val sum = array().sum
  168.           for (i <- 0 to array().size-1) array()(i) /= sum
  169.           crypto.softUpdate
  170.         }
  171.       })
  172.     panel.add(automaticButton)
  173.  
  174.     val sameButton = new JButton("Рівномірно");
  175.     sameButton.addActionListener(new ActionListener(){
  176.         def actionPerformed(event:ActionEvent)={
  177.           for (i <- 0 to array().size-1) array()(i) = 1.0/array().size
  178.           crypto.softUpdate
  179.         }
  180.       })
  181.     panel.add(sameButton)
  182.  
  183.     manualMode = new JToggleButton("Режим ЗКК")
  184.     if (showManual)
  185.       panel.add(manualMode)
  186.    
  187.     panel.setBorder(new TitledBorder("Заповення"));
  188.     return panel
  189.   }
  190.  
  191.   def getValueAt(i: Int, j: Int):Object = {
  192.     (i,j) match {
  193.       case(v,0) => if (v<array().size) prefix+(v+1) else "Sum"
  194.       case _ => Double.box(if (i<array().size) array()(i) else array().sum)
  195.     }
  196.   }
  197.  
  198.   override def setValueAt(o:Object, i:Int, j:Int){
  199.     val d = o.asInstanceOf[String].toDouble
  200.     array()(i) = d
  201.     if (manualMode.isSelected){
  202.       val countNonZero = array().count(x=>x!=0.0)
  203.       if (countNonZero>0){
  204.           for (i <- 0 to array().size-1 if (array()(i)!=0.0)) array()(i) = 1.0/countNonZero    
  205.       }
  206.     }
  207.     crypto.softUpdate
  208.   }
  209.  
  210.   override def isCellEditable(i: Int, j:Int) = (j!=0) && (i<array().size)
  211.          
  212.   def getTitle = title  
  213. }
  214.  
  215. class AposteriroriMessages(val crypto: CryptographicFunction) extends SimplifiedModel{
  216.   def getSize = (crypto.getE,crypto.getM)
  217.  
  218.   override def getColumnName(i: Int) = if (i==0) "" else "M"+i
  219.          
  220.   def getValueAt(i: Int, j: Int):Object = {
  221.     (i,j) match {
  222.       case(v,0) => "E"+(v+1)
  223.       case _ => crypto.df.format(crypto.PemMi(j,i+1))
  224.     }
  225.   }
  226.  
  227.   def getTitle = "Pe(m)"
  228. }
  229.  
  230. class AposteriroriDifference(val crypto: CryptographicFunction) extends SimplifiedModel{
  231.   def getSize = (crypto.getE,crypto.getM)
  232.  
  233.   override def getColumnName(i: Int) = if (i==0) "" else "M"+i
  234.          
  235.   def getValueAt(i: Int, j: Int):Object = {
  236.     (i,j) match {
  237.       case(v,0) => "E"+(v+1)
  238.       case _ => crypto.df.format(crypto.PemMi(j,i+1)-crypto.Pm(j-1))
  239.     }
  240.   }
  241.  
  242.   def getTitle = "Pe(m)-P(m)"
  243. }
  244.  
  245. class AposteriroriRatio(val crypto: CryptographicFunction) extends SimplifiedModel{
  246.   def getSize = (crypto.getK,crypto.getE)
  247.  
  248.   override def getColumnName(i: Int) = if (i==0) "" else "E"+i
  249.          
  250.   def getValueAt(i: Int, j: Int):Object = {
  251.     (i,j) match {
  252.       case(v,0) => "K"+(v+1)
  253.       case _ => {
  254.           val m = crypto.decode(i+1,j)-1;
  255.           if (m== -1) "" else {
  256.             val cnt = (for (i<-0 to crypto.getK-1) yield crypto.f(i)(m)).count({l=>l==j})
  257.             crypto.df.format((crypto.Pkjes(i+1,j)/crypto.Pm(m)/cnt))
  258.           }
  259.       }
  260.     }
  261.   }
  262.  
  263.   def getTitle = "Pe(k)/P(m)"
  264. }
  265.  
  266. class GUIBuilder(val crypto: CryptographicFunction){
  267.   var frame: JFrame = null
  268.          
  269.   def build {
  270.     val tabs = crypto.models
  271.     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName)
  272.            
  273.     frame = new JFrame;
  274.     frame.setSize(600, 500)
  275.     frame.setTitle("Криптографія")
  276.     frame.setLayout(new BorderLayout())
  277.     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  278.     val tabbedPane = new JTabbedPane
  279.     for (val tab <- tabs){
  280.       val panel = new JPanel
  281.       panel.setLayout(new BorderLayout())
  282.        
  283.       val scrollPane = new JScrollPane
  284.       val table = new JTable
  285.       table.setModel(tab)
  286.       table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)
  287.       if (tab.getCustomCellEditor!=null)
  288.         for (i <- tab.getCustomCellEditor){
  289.           table.setDefaultEditor(i._1, i._2)
  290.         }
  291.       scrollPane.setViewportView(table)
  292.       if (tab.getCustomTopControl!=null)
  293.         panel.add(tab.getCustomTopControl, BorderLayout.NORTH)
  294.       panel.add(scrollPane, BorderLayout.CENTER)
  295.       tabbedPane.addTab(tab.getTitle, panel)
  296.     }
  297.     frame.add(tabbedPane)
  298.      
  299.     val mainMenu = new JMenuBar
  300.     val fileMenu = new JMenu("Файл")
  301.     val openMenuItem = new JMenuItem("Відкрити")
  302.     val saveMenuItem = new JMenuItem("Зберегти")
  303.     val fileChooser = new JFileChooser
  304.     mainMenu.add(fileMenu)
  305.     fileMenu.add(openMenuItem)
  306.     fileMenu.add(saveMenuItem)
  307.     openMenuItem.addActionListener(new ActionListener(){
  308.         def actionPerformed(event:ActionEvent)={
  309.           if (fileChooser.showOpenDialog(frame)==JFileChooser.APPROVE_OPTION){
  310.             crypto.load(fileChooser.getSelectedFile)
  311.           }
  312.         }    
  313.       })
  314.     saveMenuItem.addActionListener(new ActionListener(){
  315.         def actionPerformed(event:ActionEvent)={
  316.           if (fileChooser.showSaveDialog(frame)==JFileChooser.APPROVE_OPTION){
  317.             crypto.save(fileChooser.getSelectedFile)
  318.           }
  319.         }    
  320.       })
  321.     frame.setJMenuBar(mainMenu)
  322.     frame.setVisible(true)
  323.   }
  324. }
  325.        
  326. object Main {
  327.  
  328.   def main(args: Array[String]): Unit = {
  329.     val crypto = new CryptographicFunction()
  330.     crypto.load(new File("input.txt"))
  331.     crypto.models = List(
  332.       new FTableModel(crypto),
  333.       new ArraysModel(crypto, "P(mi)","M", {()=>crypto.Pm}, false),
  334.       new ArraysModel(crypto, "P(ki)","K", {()=>crypto.Pk}, true),
  335.       new AposteriroriMessages(crypto),
  336.       new AposteriroriDifference(crypto),
  337.       new AposteriroriRatio(crypto)
  338.     )
  339.     crypto.dumpTestScenario;
  340.     crypto.load(new File("input.txt"))
  341.     new GUIBuilder(crypto).build
  342.   }
  343.  
  344. }
  345.  
Advertisement
Add Comment
Please, Sign In to add comment