Untitled

 avatar
unknown
c_cpp
a year ago
5.3 kB
5
Indexable
#include <bits/stdc++.h>

using namespace std;

vector < vector<int> > clauses;
unordered_map<int,int> l_freq;
unordered_map<int,bool> l_assign;

void input_file(), reset(vector<vector<int>>), unit_propagate(vector<vector<int>> &, int), pure(vector<vector<int>> &);
bool dpll(vector<vector<int>>);
int dlis(vector<vector<int>>), isunit(vector<vector<int>>);

int main(int argc, char *argv[])
{
    input_file();
    reset(clauses);

    if(dpll(clauses))
    {
        vector <int> te;
        cout << "s SATISFIABLE\n";
        for(auto f: l_assign)
        {
            te.push_back(f.first);
            sort(te.begin(), te.end());
        }

        for(int a=0; a<te.size(); a++)
        {
            cout << "v \" " << te[a] << " \" -> " << boolalpha << l_assign[te[a]] << endl;
        }

        cout << "Done";
    }
    else
    {
        cout << "s UNSATISFIABLE";
        return 0;
    }

    /*for(int a=0; a<clauses.size(); a++)
    {
        for(int b=0; b<clauses[a].size(); b++)
        {
            cout << clauses[a][b] << " ";
        }
        cout << endl;
    }*/
}

void input_file()
{
    ifstream file("testcase1.cnf");
    //ifstream file(argv[1]);
    vector<int> temp;

    string line, t;
    getline(file, line);
    stringstream ss(line);

    int n;
    ss >> t;
    ss >> t;
    ss >> n;
    ss >> n;

    for(int a=0; a<n; a++)
    {
        getline(file, line);
        stringstream ss(line);
        int l;

        while(ss>>l && l!=0)
        {
            temp.push_back(l);
        }

        clauses.push_back(temp);
        temp.clear();
    }
}

void reset(vector < vector<int> > clause)
{
    for(int a=0; a<clause.size(); a++)
    {
        for(int b=0; b<clause[a].size(); b++)
        {
            l_assign[abs(clause[a][b])]==true;
        }
    }
}

bool dpll(vector < vector<int> > clause)
{
    for(int a=0; a<clause.size(); a++)
    {
        for(int b=0; b<clause[a].size(); b++)
        {
            l_freq[clause[a][b]]++;
        }
    }

    while(isunit(clause)!=-1)
    {
        unit_propagate(clause, isunit(clause));
    }

    pure(clause);
    if(clause.empty())
    {
        return true;
    }
    for(int a=0; a<clause.size(); a++)
    {
        if(clause[a].empty())
        {
            return false;
        }
    }
    vector<vector<int>> fclause =clause;
    vector<int> temp ={dlis(clause)};
    clause.push_back(temp);
    temp={-dlis(clause)};
    fclause.push_back(temp);
    cout << "\ndlis: " << dlis(clause) << endl;
    cout << temp[0] << endl;
    return (dpll(clause)||dpll(fclause));
}

int isunit(vector < vector<int> > clause)
{
    for(int a=0; a<clause.size(); a++)
    {
        if(clause[a].size()==1)
        {
            return a;
        }
    }
    return -1;
}

void unit_propagate(vector<vector<int>> &clause, int i)
{
    int unitLiteral = clause[i][0];

    if (unitLiteral < 0)
    {
        l_assign[abs(unitLiteral)] = false;
    }

    cout << "unit :\n";
    int b=0;
    while(b<clause.size())
    {
        for(int c=0; c<clause[b].size(); c++)
        {
            if(clause[b][c] == unitLiteral)
            {
                clause.erase(clause.begin()+b);
                cout << "erase " << b << endl;
            }
            else if(clause[b][c] == -unitLiteral)
            {
                clause[b].erase(clause[b].begin()+c);
                cout << "erase " << b << " " << c << endl;
            }
        }
        b++;
    }
    clause.erase(clause.begin()+i);
    cout << "erase " << i << endl;
    cout << "unit end\n\n";
    for(int a=0; a<clause.size(); a++)
    {
        for(int b=0; b<clause[a].size(); b++)
        {
            cout << clause[a][b] << " ";
        }
        cout << endl;
    }
}



void pure(vector < vector<int> > &clause)
{
    cout << "pure :\n";
    for(auto f: l_freq)
    {
        if(f.second+l_freq[0-(f.first)]==1)
        {
            for(int a=0; a<clause.size(); a++)
            {
                auto it=find(clause[a].begin(), clause[a].end(), f.first);
                if(it!=clause[a].end())
                {
                    if(f.first<0)
                    {
                        l_assign[abs(f.first)]=false;
                    }
                    cout << "pure :" << a << endl;
                    clause.erase(clause.begin()+a);
                }
            }
        }
    }

    cout << "pure end\n\n";

    for(int a=0; a<clause.size(); a++)
    {
        for(int b=0; b<clause[a].size(); b++)
        {
            cout << clause[a][b] << " ";
        }
        cout << endl;
    }
}

int dlis(vector < vector<int> > clause)
{
    int large=0, fr=0;

    for(auto f: l_freq)
    {
        if(l_freq[f.first]+ l_freq[0-f.first] > fr)
        {
            if(l_freq[f.first] >= l_freq[0-f.first])
            {
                large=f.first;
            }
            else
            {
                large=0-f.first;
            }
            fr=l_freq[f.first]+ l_freq[0-f.first];
        }
    }
    return large;
}
Editor is loading...
Leave a Comment