{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy\n", "import math\n", "import csv\n", "import time\n", "import matplotlib.pyplot as plt\n", "import ast\n", "from scipy import stats\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def generateSequence(sequence, domain, value, operator, probability, fr, to):\n", " if operator == 'eq':\n", " prob = [(1.0 - probability) / (len(domain) - 1) for i in domain]\n", " prob[domain.index(value)] = probability\n", " seq = list(sequence)\n", " for i in range(fr, to):\n", " seq[i] = numpy.random.choice(domain, p = prob)\n", "\n", " return seq" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def plotSequence(axarr, seq, domain, attrName, curr_state):\n", " N = 1\n", " colors = [numpy.random.rand(1,3) for i in domain]\n", " ind = numpy.arange(N) # the x locations for the groups\n", "\n", " p = [0 for i in domain]\n", " for i in range(0, len(seq)):\n", " for j in range(0, len(domain)):\n", " if seq[i] == domain[j]:\n", " p[j] = axarr.barh(ind, 1, left=i, color=colors[j] )\n", "\n", " axarr.set_xlabel('State nr')\n", " axarr.set_ylabel(str(attrName))\n", " axarr.set_yticks([])\n", " axarr.set_yticklabels(['Attr_1'])\n", "\n", " axarr.set_xticklabels(numpy.arange(-curr_state, len(seq)-curr_state+1, 10),minor=False)\n", " axarr.set_xticks(numpy.arange(0, len(seq)+1, 10),minor=False)\n", " axarr.legend((p), (domain))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def saveToCsv(listOfConfigs, sequences):\n", " timestr = time.strftime(\"%Y_%m_%d-%H:%M:%S\")\n", " with open('sequence_'+timestr+'.csv','wb') as csv_file:\n", " writer = csv.writer(csv_file, delimiter=',')\n", " writer.writerow([config['attr_name'] for config in listOfConfigs])\n", " for i in range(len(sequences[0])):\n", " writer.writerow([seq[i] for seq in sequences])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def seq_stats(config, seq):\n", " config_values = config['value']\n", " domain = ast.literal_eval(config_values[0]['domain'])\n", " \n", " for config_val in config_values:\n", " value = ast.literal_eval(config_val['value'])\n", " probability = float(config_val['probability'])\n", " \n", " fr = abs(int(float(config_val['from'])))\n", " if config_val['to'] != '0':\n", " to = abs(int(float(config_val['to'])))\n", " else:\n", " to = 0\n", "\n", " counter = seq[curr_state-fr:curr_state-to].count(value)\n", " \n", " print(\"Value:\", value)\n", " print(\"< -\",fr, \",-\",to,\" >\")\n", " print(\"Should be about: \", len(seq[curr_state-fr:curr_state-to])*probability, \" (\", probability*100, \"%)\")\n", " print(\"Is: \", counter, \" (\", (counter/(len(seq[curr_state-fr:curr_state-to])*1.0))*100.0, \"%)\")\n", " print() \n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parameters" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "plt.rcParams['figure.figsize'] = 18, 6\n", "\n", "past_states = 1.5\n", "future_states = 1.5\n", "\n", "plot = True\n", "save = False\n", "random = True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get configurations from config file and group them by attribute name." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "with open(\"config\") as f:\n", " lines = f.readlines()\n", "\n", "config_list = []\n", "for line in lines:\n", " line = line.replace(\" \", \"\").replace(\"\\n\", \"\")\n", " config = {}\n", " for elem in line.split(';'):\n", " elem = elem.split('=')\n", " config[elem[0]] = elem[1]\n", " config_list.append(config)\n", "\n", "grouped_config_list = []\n", "for config in config_list:\n", " key = config['attr'].replace(\"'\",\"\")\n", " if not any(key in d['attr_name'] for d in grouped_config_list):\n", " attr_dict = {}\n", " values_list = []\n", " values_list.append(config)\n", " attr_dict['attr_name'] = key\n", " attr_dict['value'] = values_list\n", " grouped_config_list.append(attr_dict)\n", " else:\n", " attr_dict = [d for d in grouped_config_list if d['attr_name'] == key][0]\n", " attr_dict['value'].append(config)\n", "\n", "# for conf in grouped_config_list:\n", "# for key, value in conf.items():\n", "# print key,\": \", value if key == 'attr_name' else ' '\n", "# if key != 'attr_name':\n", "# for v in value:\n", "# print \"\\t\", v\n", "# print" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n73xOy48nqV9kLVDjF7/8fvsLSTNU/OV4htrPafOxt0l6pCDuc5IurVtX+atGJsb5UBWn4kmD0nrK\nT/S8t9m46H0LuTC2IK5Dn4b3jgmvj5V0Tc02vqD2idHRkn5fUmZ29WDp/p4oc3n4vO2Y2UTuTM3H\n1cibtrr2559OP9PAzLYLHXhp4uMhZrbIzO4ys6PCeyMlrXXOrQuxU+QvE4nXOUB+puvTufVtJ2lV\nVOaV8oN/HDvazO6TT/rznHN/qhMXxe8lP7P7SFZX+ZOfGfKXvCTjcqrisgE6syq8t114LTObIek/\n5K8uOCEst1TSQWY21MxGyc8ojlbUp2G5CfInOTdksc65hfKX9D0Vfn7hnHuoRpmxD8tfttbWxrAd\nZ0j6rvzsYxY3TtJaM7vOzH5nZheY2cAacVJ13nSIq8qZsvaV5Uy0nu3lL/u8QYm+SeVNRRtTquIq\n8yZ6/53ys62S/03APmY20syGys/Ejg6fbeWceyq8flr+5OhGSXLOPSn/ZeJx+Zx5wTl3kzrm2yr5\nSaKsvFicM6nytpJ0YhS7vfwtJN8JeXO5mW1aVdfASbrJzBab2cdLyszHfU3+RCcehyrbaGYDzWyJ\n/KV6NzvnfttM35hZq6Td5WfC69SzSFWfFuVNvq4vyt/ek6mbNy/Lz+RLaipv8uXFyvKmoTzVz5l8\nnFQ/ZzZL1LFO3nRoY828KeybirxJtbFIWVzdnMneXyrp/aF+e8n/tqalZD2Zi+Unr/8k/1uoM5xz\nb9SIUyhrqPwl8T+uqHdmnKThZrYgbPN/rhknSVPNbKmZ3WhmE+rGlZwj1YmdYWbL1HjcqdU3QZ1x\noErduM6uP5Yaywrl9oXK2Py+J3+8TuVzXn5fL9oP8lLjS1U9i8azpvpGjWNoaWxqzJb/JVNVG4uO\nEXXrWrRcPpeelp/MqJLKwa1Llj9BxfvH0/JXpLQxs3PN7An5c8Gz69TVzI6Un7hbWlHXVBtPNbP7\nzOwKMxtes57j5LfJb83sNjObXLd9wT6S/uycW1EQl+rTT0q6IPTNhfJfpOu08UH527AkPwE1uiBu\nlaTtau7vqdg91XjMTEnF7VYQV5Y3nRn3+pz1eRDi1+TvvXwj8dnbnHN7SvpHSV8zs7cnYv89ETdL\n0s+dc6sSn7WVKT8gN3DOPeGc21X+EqmZZrZVnThJMrNt5L+ofTTXntK4Ep2Nk3NuvqTj5a8I+HJ4\n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\nx/049M198n8ecLs6dc311Uo1/snFsjZ+V35cvE/S/6pxEqGsnoMlfS/U9V5J+9eJi8anTyS2cVWf\nTpN/BsZS+fv/96jZxjPkx4s/yN/iZokyH1cT+3tU5pMhbkUurip3srg/5uLq5M1yhb8i0d9/stls\nAAAAAACABuvzIEQAAAAAANCPMWkAAAAAAACSmDQAAAAAAABJTf3JxWaMGjXKtba2dtfqAQAAAABA\nJy1evHi1c27LquW6bdKgtbVVixYt6q7VAwAAAACATjKzx+osx+0JAAAAAAAgiUkDAAAAAACQ1G23\nJ7y+5kWt/Z+bNfvpyyVJY8/4oiTpxB880fDeiq9/Qf+x9cfa4r59zGhJ0vJnHteA739bkvTGsSdq\np7eO0Yk/eKJtmeXPPC5JOv9XptlPX643jj2x7f+Z2U9f3lBuvP4VX/9CW0y8bkn67H6ubT2f3c9p\np7eOaYvJ1lfUlrgen93PtS0b1yt+X1JbO/PrSNUrXl9WtqS2PszavOLrX2h7P1/HOCbrj7LtEvfv\ngO9/u6F+Wb/ky8rWk22nuJ3Z9oxj4+2U1SlVr1jWN9n2yvonrmPWV5nZT1/ekG/59+P8y8dldY/b\nHi+XrSOuR6pd+TyK/7/8mcfb1p1vZ6pf4risf+M6ZO3P6h9vo6wfsmVT5cbtLmpz3Ja4/tlyqXbH\n/ZHVPb9vxW3O8ijetvHr/P6201vHNMTE7f32MaPb8u6NY09Mfp7VN5P1W377Z8vF+RaL+z6ut9Rx\n/8jHpNaZtSvef+Ll8u9nZcXKclhSh304NQZl/R33XZxX8bgSj9dxfYr6MhPnZzwWxuNzWX3z43ic\nI3Fepvoz/n+cF6n9M79cXv54lb2X9U+cH/ncyC+fxRQdW+LxLT+m5cfW/L6aypUsPt5+cTvjHCga\n7/PH4CwuWybeZvG+mT+OFbU5W1/clljR8Ts/HmV9VlZe3F50lB9P8/mWife//BgRy8b4VJ7G78f7\nUb4ebxx7YodxIBPvL1nuxeNSnH/5c8eisTV/3E8dQ/PnPfl25Y+bZXXK527qs3wup45xcWyqr4py\nP39sjJfJPitqZ1ynuLw4b7KxNT8GZm3Of3+Ix5n4/aK4fFn58+RMfrtky+fbku+D/PlR0bbN+iGr\nU/xZ6lwyHjOLtnPczvz3jri8ePyM+ylbf2r8T323i4+vmfx3klR/pBQdq/Ly27voO1uWe0XnS2X9\n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\nuPLKK9lvv/3GpLzWSYOU0n3AfRGxKqV0a/W1iPhSSukvx6RmkiRJkiStZ778nM+v1fW985H5axS3\nxx57cN555/H6179+rdan32juaTCn+p+ImALMXbvVkSRJkiRJVaeeeiq77bYbhxxyCMuWLQNg9uzZ\n7L777mNedpd7GrwP+BvgKRFxf+WlPwCfHauKSZIkSZL0ZHfNNddwzjnnsGjRIlatWsW+++7L3Lnr\n7vv7LpcnfBT4aER8FPg4sBswtffyGNZNkiRJkqQntcsuu4xjjjmGadOmAfDSl750nZbf5UaIPbcA\nPwSGgEXAgcBC4PljUC9JkiRJkjTORnNPg5OB/YFbU0qHAfsA945JrSRJkiRJEs997nO54IILePjh\nh3nggQf4xje+sU7LH82kwe9TSr8HiIhNUkpLgbG/64IkSZIkSU9S++67L8ceeyx77bUXRxxxBPvv\nvz8A559/PkNDQyxcuJCjjjqKF7/4xWNS/mguT1gREVsAFwAXR8Q9wK0tMZIkSZIkTRqvvvxEALad\nu906K3P+/PnMnz/ypxmPOeaYMS+786RBSqlXmwUR8QNgc+C/xqRWkiRJkiRp3I3mTIPHpZQuXdsV\nkSRJkiRJ65fR3NNAkiRJkiQ9iThpIEmSJEnSIAkSabxrscZSemJ1d9JAkiRJkqQBfveHDXlw1YMT\ncuIgpcRdd93F1KlT13gda3RPA0mSJEmSngyuv+cpcPONTH/GUyHuIn77IAD3LLl3nGvWzdSpUxka\nGlrjeCcNJEmSJEka4A+PbcDid14FwGPnHccGf/p1AN75yMifQJyMvDxBkiRJkiTVctJAkiRJkiTV\nctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJA\nkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJ\nkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTVctJAkiRJkiTV\nipTSmKx4v/32S1dfffWYrFuSJEmSJK25iLgmpbRf23KeaSBJkiRJkmo5aSBJkiRJkmo5aSBJkiRJ\nkmo5aSBJkiRJkmqN2Y0QI+IBYNkahG4NrFyHceNR5mSPG48yJ0rceJQ52ePGo8zJHjceZU72uPEo\n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\n3N3e5A9N15FPA57RVtdSn8Ws/jmt+V3bWFluHsM//A1sI3nS7qeljtcz/CfYmuIOIX9z3fvppsd/\nSqnDe/Hv5LOl/lBy5jWj6NMjyRNiN/f1zc6lHatK7L1l3b1fZWnKm8tKzKpSdjWuKW+aymvKm6by\nmnKmNo72nPke+QDg9+Rv/YfVtSVvattIe94MimvLm6a+acqbprimnOnffx9Ull1GPuCa0ZZ75bXt\nyac2/6z0x3FtY13fOH9OzfMDyyuvv5uc09cz/GdEm+r55pIji8lj8nO6lte3nrPocBxQXntvKXPY\nfqdD3OfIZ3D08qR1HCivbVve/xG53rWNo+yLEXnJ6u3uRvJE1pY1cbXbQlssA7Y9avK5oc7zWD1p\n0BjHgPGlYxtHjGdd4gaNoR3LHDFmd+kbavYRdeWN5v0mf+D7dMmje8nHtdW4Y8rjR4BfM/wGnPNL\n3DLyB8P+Mm8iH2P1cuczNbH3k4+nqnH/UfrmOvLPAz69S137+mo5w39ysamNXyKPi9cBX2f4JEJT\nPTcG/q3U9Vrg+V3iKuPTG2re47Y+PYR8D4zF5Ov/53Zs41vJ48XPyZe4RU2ZtzGK7b1S5h0l7sa+\nuLbc6cX9oi+uS94so/yKxGT/681mS5IkSZIkDfNEboQoSZIkSZImMScNJEmSJElSLScNJEmSJElS\nLScNJEmSJElSLScNJEmSJElSLScNJEmapCJifkTcEBHXRcSiiHh2ef5tETGtQ3yn5SRJ0uTlTy5K\nkjQJRcRBwD8A81JKj0TE1sDGKaVfRsRyYL+U0sqWdXRabg3qNiWltGptrlOSJI0NzzSQJGly2g5Y\nmVJ6BCCltLJMGJwMbA/8ICJ+ABARZ0bE1eWshA+V5+qWe1FELIyIayPi3IiY3l9oRFwSER+LiCsj\n4ucRcWh5/oSI+HpEfB/43rroAEmS9MR5poEkSZNQ+UD/I2Aa8F3gKymlS8try6mcQRARW6aU7o6I\nDckf6E9OKV1XXa6cqXAecERK6cGIeC+wSUrpb/vKvQS4JqX0zog4EnhHSulPIuIE4CPAnimlu8e8\nAyRJ0lrhmQaSJE1CKaXfAXOB1wG/Bb5SPrjX+fOIuBb4KTAHeFbNMgeW538cEYuA44EdB6zvvPLv\nNcCsyvMXO2EgSdLEMmW8KyBJksZGSulR4BLgkoj4GfmD/lnVZSJiJ+BdwP4ppXsi4ixgas3qgvyh\n/1Udin6k/Psow481HhxN/SVJ0vjzTANJkiahiNg9InatPLU3cGt5/ADw1PJ4M/KH+fsiYhvgiEpM\ndbkrgIMjYpey/k0jYrexqr8kSVo/eKaBJEmT03TgnyJiC2AVcBP5UgWAzwL/FRG/TCkdFhE/BZYC\ntwM/rqyjf7kTgH+PiE3K6/8H+Pk6aIskSRon3ghRkiRJkiTV8vIESZIkSZJUy0kDSZIkSZJUy0kD\nSZIkSZJUy0kDSZIkSZJUy0kDSZIkSZJUy0kDSZIkSZJUy0kDSZIkSZJUy0kDSZIkSZJU6/8Dejyg\nKlooY8QAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Value: a1\n", "< - 180 ,- 57 >\n", "Should be about: 121.77 ( 99.0 %)\n", "Is: 0 ( 0.0 %)\n", "\n", "Value: b1\n", "< - 300 ,- 0 >\n", "Should be about: 297.0 ( 99.0 %)\n", "Is: 299 ( 99.66666666666667 %)\n", "\n", "Value: b1\n", "< - 50 ,- 0 >\n", "Should be about: 49.5 ( 99.0 %)\n", "Is: 50 ( 100.0 %)\n", "\n" ] } ], "source": [ "curr_state = int(max([abs(int(float(config_list[i]['from']))) for i in range(len(config_list)) if 'from' in config_list[i]])*past_states)\n", "last_state = int(curr_state*future_states)\n", "seqs = []\n", "number_of_configs = len(grouped_config_list)\n", "f, axarr = plt.subplots(number_of_configs)\n", "\n", "for counter, config in enumerate(grouped_config_list):\n", " config_values = config['value']\n", " init_value = ast.literal_eval(config_values[0]['domain'])[0]\n", " domain = ast.literal_eval(config_values[0]['domain'])\n", " operator = 'eq'\n", " \n", " if random:\n", " seq = [numpy.random.choice(ast.literal_eval(config_values[0]['domain'])) for k in range(0, last_state)]\n", " else:\n", " seq = [init_value for k in range(0, last_state)]\n", " \n", " for config_val in config_values:\n", " value = ast.literal_eval(config_val['value'])\n", " probability = float(config_val['probability'])\n", " fr = curr_state - curr_state\n", " to = curr_state - last_state\n", " \n", " if 'from' in config_val:\n", " fr = abs(int(float(config_val['from'])))\n", " if config_val['to'] != '0':\n", " to = abs(int(float(config_val['to'])))\n", " else:\n", " to = 0\n", "\n", " seq = generateSequence(seq, domain, value, operator, probability, curr_state-fr, curr_state-to)\n", "\n", " if(plot):\n", " plotSequence(axarr[counter], seq, domain, config['attr_name'], curr_state)\n", " \n", " seqs.append(seq)\n", "\n", "if plot:\n", " plt.show()\n", "\n", "if save:\n", " saveToCsv(grouped_config_list, seqs)\n", "\n", "for i in range(0,len(seqs)-1):\n", " seq_stats(grouped_config_list[i], seqs[i])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "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 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }