packages feed

g2-0.2.0.0: inference/Main.hs

{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import G2.Config as G2
import G2.Interface
import G2.Liquid.Config
import G2.Liquid.Interface
import G2.Liquid.Inference.Config
import G2.Liquid.Inference.G2Calls
import G2.Liquid.Inference.Initalization
import G2.Liquid.Inference.Interface
import G2.Liquid.Inference.Verify
import G2.Liquid.Helpers

import Language.Fixpoint.Solver
import Language.Fixpoint.Types.Constraints
import Language.Haskell.Liquid.Types as LH

import Control.DeepSeq
import qualified Data.Map as M
import qualified Data.Text as T
import Data.Time.Clock
import System.Environment

main :: IO ()
main = do
    (f, count, config, g2lhconfig, infconfig, func) <- getAllConfigsForInf

    case func of
        Nothing -> do
                    if count
                            then checkFuncNums f infconfig config g2lhconfig
                            else callInference f infconfig config g2lhconfig
        Just func' -> do
            ((in_out, _), entry) <- runLHInferenceAll infconfig config g2lhconfig (T.pack func') [] [f]
            printLHOut entry in_out
            return ()

-- checkQualifs :: String -> G2.Config -> IO ()
-- checkQualifs f config = do
--     undefined
--     -- qualifGen "qualif.hquals" 
    
--     finfo <- parseFInfo ["qualif.hquals"]

--     let infconfig = mkInferenceConfig []
--     lhconfig <- quals finfo `deepseq` defLHConfig [] []
--     let lhconfig' = lhconfig { pruneUnsorted = True }
--     ghcis <- ghcInfos Nothing lhconfig' [f]
--     let ghcis' = map (\ghci ->
--                         let
--                             ghci_quals = getQualifiers ghci-- spc = spec ghci
--                             new_quals = ghci_quals ++ quals finfo 
--                         in
--                         putQualifiers ghci new_quals) ghcis

--     start <- getCurrentTime
--     res <- doTimeout 360 $ verify infconfig lhconfig' ghcis'
--     stop <- getCurrentTime

--     case res of -- print $ quals finfo
--         Just Safe -> do
--             putStrLn "Safe"
--             print (stop `diffUTCTime` start)
--         Just _ -> putStrLn "Unsafe"
--         Nothing -> putStrLn "Timeout"

callInference :: String -> InferenceConfig -> G2.Config -> LHConfig -> IO ()
callInference f infconfig config lhconfig = do
    (s, gs) <- inferenceCheck infconfig config lhconfig [] [f]
    case gs of
        Left gs' -> do
            putStrLn "Counterexample"
            printCE s gs'
        Right gs' -> do
            putStrLn "Safe"
            print gs'

checkFuncNums :: String -> InferenceConfig -> G2.Config -> LHConfig -> IO ()
checkFuncNums f infconfig config g2lhconfig = do
    (ghci, lhconfig) <- getGHCI infconfig [] [f]
    (lrs, _, _, _, main_mod)  <- getInitState [] [f] ghci infconfig config g2lhconfig
    let nls = getNameLevels main_mod lrs

    print nls

    print $ length nls
    print $ length (concat nls) - 1

    return ()