QString DesignDocumentView::toText() const
{
    QScopedPointer<Model> outputModel(Model::create("QtQuick.Rectangle", 1, 0, model()));
    outputModel->setFileUrl(model()->fileUrl());
    QPlainTextEdit textEdit;

    QString imports;
    foreach (const Import &import, model()->imports()) {
        if (import.isFileImport())
            imports += QStringLiteral("import ") + QStringLiteral("\"") + import.file() + QStringLiteral("\"")+ QStringLiteral(";\n");
        else
            imports += QStringLiteral("import ") + import.url() + QStringLiteral(" ") + import.version() + QStringLiteral(";\n");
    }

    textEdit.setPlainText(imports +  QStringLiteral("Item {\n}\n"));
    NotIndentingTextEditModifier modifier(&textEdit);

    QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr));
    rewriterView->setCheckSemanticErrors(false);
    rewriterView->setTextModifier(&modifier);
    outputModel->setRewriterView(rewriterView.data());

    ModelMerger merger(rewriterView.data());

    merger.replaceModel(rootModelNode());

    ModelNode rewriterNode(rewriterView->rootModelNode());

    rewriterView->writeAuxiliaryData();
    return rewriterView->extractText({rewriterNode}).value(rewriterNode) + rewriterView->getRawAuxiliaryData();
    //get the text of the root item without imports
}
SSMProcess* GIOutputModeler::compute()
{
    const int g = - Lb(m_ptrData->getDistribution(1,1));
    const int h = Ub(m_ptrData->getDistribution(1,1));
    const ivector u = m_ptrData->getDistribution(1,1);

    // perform Wiener-Hopf factorization
    ComputationParameters whParams;
    whParams.setInt(SMPWienerHopf::PARAM_NUMITERATIONS, 200);
    whParams.setReal(SMPWienerHopf::PARAM_EPSILON, real(1e-14));
    SMPWienerHopf wh(m_ptrData, whParams);
    const ISMPWHFactors* whFactors = wh.compute();

    ivector l = whFactors->getIdleDistributions().getVectorAt(1,1);
    ivector v = whFactors->getPhaseDistributions().getVectorAt(1,1);

    // create SMP model as described by Haßlinger
    // transition probabilities
    imatrix trans = IMatrixUtils::zeros(1,2,1,2);

    // a_00
    for(int i = 1; i<=g; ++i)
        trans[1][1] += u[-i];

    // E(N) = (I-V(1))^-1
    interval v1(0.0);
    for(int i = Lb(v); i<=Ub(v); ++i)
        v1 += v[i];
    interval e_n = 1.0 / (1.0 - v1);

    // a_11
    trans[2][2] = 1.0 - ((1.0 - trans[1][1])/(e_n - 1.0));

    // a_01, a_10
    trans[1][2] = 1.0 - trans[1][1];
    trans[2][1] = 1.0 - trans[2][2];

    // END of transition probabilities.

    // I^(N=1) (z)
    ivector i_n_eq_1(1,g);
    for(int i = 1; i<=g; ++i)
    {
        i_n_eq_1[i] = u[-i] / trans[1][1];
    }

    // I^(N>1) (z)
    ivector i_n_gr_1(1,g);
    for(int i = 1; i<=g; ++i)
    {
        i_n_gr_1[i] = (l[i] - trans[1][1]*i_n_eq_1[i])/(1.0 - trans[1][1]);
    }

    // state-specific distributions
    ivector s = m_ptrData->getServiceProcess()->getDistribution(1,1);
    ivector a00 = IMatrixUtils::conv(i_n_eq_1, s);
    ivector a01 = s;
    ivector a10 = s;
    ivector a11 = IMatrixUtils::conv(i_n_gr_1, s);

    // determine bounds
    int lowerBound = Lb(s);
    int upperBound = Ub(s) + std::max<int>(Ub(i_n_eq_1), Ub(i_n_gr_1));

    IMatrixPolynomial distributions(lowerBound, upperBound,1,2,1,2);
    imatrix emptyMatrix(1,2,1,2);
    emptyMatrix[1][1] = interval(0.0);
    emptyMatrix[1][2] = interval(0.0);
    emptyMatrix[2][1] = interval(0.0);
    emptyMatrix[2][2] = interval(0.0);
    for(int i = lowerBound; i<=upperBound; ++i)
        distributions[i] = emptyMatrix;
    distributions.setVectorAt(1,1,a00);
    distributions.setVectorAt(1,2,a01);
    distributions.setVectorAt(2,1,a10);
    distributions.setVectorAt(2,2,a11);


    // create SMP model
    SMProcess outputModel(trans, distributions);

    // convert to SSMP model
    SSMProcess* ssmpOutputModel = new SSMProcess(outputModel);

    // return
    return ssmpOutputModel;
}