Static Analyzer for Solidity
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
slither/utils/similarity/plot.py

73 lines
2.0 KiB

6 years ago
import logging
import sys
import traceback
import operator
import numpy as np
import random
6 years ago
try:
from sklearn import decomposition
import matplotlib.pyplot as plt
except ImportError:
decomposition = None
plt = None
6 years ago
from fastText import load_model
from .cache import load_cache
6 years ago
logger = logging.getLogger("Slither-simil")
6 years ago
def plot(args):
6 years ago
if decomposition is None or plt is None:
print("ERROR: In order to use plot mode in slither-simil, you need to install sklearn and matplotlib:")
print("$ pip3 install sklearn matplotlib --user")
sys.exit(-1)
6 years ago
try:
6 years ago
6 years ago
model = args.model
model = load_model(model)
filename = args.filename
contract = args.contract
fname = args.fname
solc = args.solc
infile = args.input
ext = args.filter
if contract is None or fname is None or infile is None:
logger.error('The plot mode requieres contract, fname and input parameters.')
sys.exit(-1)
6 years ago
logger.info('Loading data..')
6 years ago
cache = load_cache(infile, model, ext=ext, solc=solc)
data = list()
fs = list()
6 years ago
logger.info('Procesing data..')
6 years ago
for (f,c,n),y in cache.items():
if c == contract and n == fname:
fs.append(f)
data.append(y)
data = np.array(data)
pca = decomposition.PCA(n_components=2)
tdata = pca.fit_transform(data)
6 years ago
logger.info('Plotting data..')
6 years ago
plt.figure()
assert(len(tdata) == len(fs))
for ([x,y],l) in zip(tdata, fs):
x = random.gauss(0, 0.01) + x
y = random.gauss(0, 0.01) + y
plt.scatter(x, y, c='blue')
6 years ago
#plt.text(x-0.001,y+0.001, l.split("_")[1].replace(".sol.ast.compact.json",""))
6 years ago
6 years ago
plt.savefig('plot.png', bbox_inches='tight')
6 years ago
except Exception:
logger.error('Error in %s' % args.filename)
logger.error(traceback.format_exc())
sys.exit(-1)